import gvar from "@/api/ws/global.js"
import store from '@/store'

let wsUrl = "wss://app.sztosee.cn:9502"; // 线上环境 在本地开发也可以用线上环境
//let wsUrl = "ws://p.sztosee.cn:9503"; // 测试环境
//let wsUrl = "ws://192.168.0.254:9503"; // 本地测试环境
//let wsUrl = process.env.VUE_APP_WS_API;
//创建ws对象
export function createWebSocket() {
    return new Promise((resolve,reject)=>{
        
        if(gvar.ws){
            console.log(gvar.ws.readyState)
        }
        if(gvar.ws && gvar.ws.readyState == 1){
            //由于有时候new的时候会改变fd 因此要经常重新登录一下，这个登录的逻辑到时候要改改，现在后台的登录太浪费资源了。
            //let ocmd = `CD#${sessionStorage.getItem('socket_id')}#AGENT#${sessionStorage.getItem('socket_salt')}#{}`;
            //向服务器发送登录注册数据
            //gvar.ws.send(ocmd);
            resolve(gvar.ws)
        }else{
            console.log(gvar.ws,'每次都要重新连接嘛，不会吧')
            gvar.ws = new WebSocket(wsUrl)        
            initEventHandle()                        
            //每次重新连接，需要立即更新fd
            setTimeout(()=>{
                resolve(gvar.ws)
            },1000);
            
        }        
    })
}

function initEventHandle() {    
    //用于指定连接关闭后的回调函数
    gvar.ws.onclose = function () {
        console.log("llws连接关闭!" + new Date().toLocaleString());   
        //createWebSocket();
    };
    //用于指定报错时的回调函数
    gvar.ws.onerror = function () {
        console.log("llws连接错误!");        
    };
    //用于指定连接成功后的回调函数
    gvar.ws.onopen = function () {
        // let ocmd = `CD#${sessionStorage.getItem('socket_id')}#AGENT#${sessionStorage.getItem('socket_salt')}#{}`;
        // //向服务器发送登录注册数据
        // gvar.ws.send(ocmd);
    };
    //用于指定收到服务器数据后的回调函数
    gvar.ws.onmessage = function (event) {
        console.log("咋的 收不到消息呀。。。。")
        //如果获取到消息，心跳检测重置
        console.log(event.data,"是不是内存的原因")
        let received_msg = null;
        received_msg = JSON.parse(event.data);
        console.log('直接json.parse',JSON.parse(event.data));
        console.log("返回的消息",received_msg)

        //监听设备ID与返回设备ID不一致，取消监听
        if (gvar.deviceid == '' || (gvar.deviceid != '' && received_msg['deviceid'] != gvar.deviceid)) {
            return false;
        }

        if (received_msg && received_msg['desired']) {
            switch (received_msg['cmd']) {
                case  'CMD-101':

                    if (received_msg['desired']['arrays']) {
                        console.log('101返回的信息',received_msg)
                        //cmd101(received_msg);
                        //需要将信息合并 因为分路过多，会分批次发送过来，最好的处理的办法是按照设备合并信息
                        //只要是设备号一致的，那就合并，如果不一致那就是新的
                        //console.log("合并前",store.state.ws.devicebaseinfo)
                        if(store.state.ws.devicebaseinfo.deviceid == received_msg.deviceid){
                            //let arrays = store.state.ws.devicebaseinfo.desired.arrays.concat(received_msg.desired.arrays)
                            //必须received_msg 放前面，不然新的数据会覆盖不过来
                            let arrays = received_msg.desired.arrays.concat(store.state.ws.devicebaseinfo.desired.arrays);
                            let filters = {}
                            let newArrays = [];
                            arrays.forEach(item=>{
                                if(!filters[item.device.id]){
                                    filters[item.device.id] = true;
                                    newArrays.push(item)
                                }
                            })
                            received_msg.desired.arrays = newArrays
                        }
                        store.dispatch("setDeviceBaseInfo",received_msg)
                    }
                    break;
                case 'CMD-102':
                    if (received_msg['desired']['arrays']) {
                        //cmd102(received_msg);                        
                        console.log("102返回的信息",received_msg);
                        store.dispatch("setDeviceSwitchInfo",received_msg)
                    }
                    break;
                case 'CMD-104':
                    let info = received_msg['desired']['arrays'];
                    console.log("104返回的信息",received_msg);
                    if (info) {
                        store.dispatch("setDeviceParamInfo",received_msg)
                        //cmd104(info);
                    }
                    break;
                case 'CMD-110':
                    console.log("110返回的信息",received_msg);
                    // 不触发报警弹窗
                    if (typeof notAlarmProp != undefined && notAlarmProp == true) {
                        return false;
                    }
                    //是否是地图标注（有，则不弹窗）
                    if (typeof mapListener != 'undefined') {
                        _map.addDevices(received_msg);
                        return false;
                    }
                    cmd110(received_msg, deviceid);
                    break;
            }
        }
    };
}

// 监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
window.onbeforeunload = function () {
    gvar.ws.close();
}


//不用登陆,心跳的作用就是更新当前请求设备的缓存数据，保证描述符在该设备的缓存中。
//多加一个dd命令就是将更新当前设备缓存的，然后隐藏掉cd，不需要大面积的更新设备的描述符
//需要硬件主动消息的时候才需要心跳
// setInterval(()=>{
//     if(gvar.ws && gvar.ws.readyState == 1){
//         let heartcmd = `DD#${sessionStorage.getItem('socket_id')}#AGENT#${sessionStorage.getItem('socket_salt')}#{"deviceid":"${gvar.deviceid}"}`;
//         gvar.ws.send(heartcmd)
//     }
//     console.log(gvar.deviceid,'deviceid...')
// },10000)
